#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Filename: logistic_regression.py
# 多层感知机分类算法

from sklearn.neural_network import MLPClassifier

X = [[0., 0.], [1., 1.]]
y = [0, 1]

# solver：求解算法，取值有：{'lbfgs', 'sgd', 'adam'}, 默认 'adam'
#       lbfgs：牛顿算法簇中的优化器；sgd：stochastic gradient descent，即随机梯度下降；adam是一个基于sgd的优化器
# alpha：L2正则化参数
# activation：激活函数，取值有{'identity', 'logistic', 'tanh', 'relu'}, 默认 'relu'
#       identity：等于，即激活函数是空，结果就是多元线性回归；f(x) = x
#       logistic：即Sigmoid函数，范围0~1;f(x) = 1 / (1 + exp(-x))
#       tanh：f(x) = tanh(x)，范围是(-1, 1)
#       relu：f(x) = max(0, x)，曲线是0，到达阈值后45度上升
# hidden_layer_sizes：隐藏层的个数是 5*2 的；即有一个有5个神经元的隐藏层1，2个神经元的隐藏层2
#       (50,)：表示有1有50个神经元的隐藏层
#       (5, 6, 3)：表示有3个隐藏层，神经元的个数分别是5, 6, 3
# tol:阈值
clf = MLPClassifier(solver='sgd', alpha=1e-5, activation='logistic', hidden_layer_sizes=(5, 2), max_iter=2000, tol=1e-4)
clf.fit(X, y)

# 开始预测
predicted_value = clf.predict([[2., 2.], [-1., -2.]])
print(predicted_value)
predicted_proba = clf.predict_proba([[2., 2.], [-1., -2.]])
print(predicted_proba)

# 输出层的拓扑关系数据，即每组数有两个，前一个数组代表前一层的神经元个数，后一个代表后一层的神经元个数
# 总神经层数组数(包括输入输出)=shape的数据元素个数+1
# 隐藏层个数=shape的数据元素个数-1
print([coef.shape for coef in clf.coefs_])
# 输出相邻两层每个节点之间的概率，array的个数等于上面shape的元素个数
print([coef for coef in clf.coefs_])
